package com.atguigu.gmall.pay.notify;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.common.util.JSONs;
import com.atguigu.gmall.mq.constant.MqConst;
import com.atguigu.gmall.mq.service.RabbitMqService;
import com.atguigu.gmall.pay.config.properties.AlipayProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @author lfy
 * @Description
 * @create 2023-08-05 11:49
 */
@Slf4j
@RequestMapping("/api/payment")
@RestController
public class PaySuccessNotifyController {


    @Autowired
    AlipayProperties alipayProperties;

    @Autowired
    RabbitMqService mq;
    /**
     * https://opendocs.alipay.com/open/270/105902?pathHash=d5cd617e&ref=api
     * 1）、对于 PC 网站支付的交易，在用户支付完成之后，支付宝会根据 API 中商家传入的 notify_url，通过 POST 请求的形式将支付结果作为参数通知到商家系统。
     * 2）、在进行异步通知交互时，如果支付宝收到的应答不是 success ，
     * 支付宝会认为通知失败，会通过一定的策略定期重新发起通知。通知的间隔频率为：4m、10m、10m、1h、2h、6h、15h。
     * 分布式事务【最大努力通知】： 支付成功：立即通知一次。   响应非success，再有7次通知
     *
     * 异步通知：支付宝在订单支付成功以后，会给我们这个方法发送请求。
     * @param  params: 使用Map类型的参数配合 @RequestParam 可以一次性拿到当前请求带来的所有参数
     * @return
     */
    @PostMapping ("/notify/success")
    public String success(@RequestParam Map<String,String> params) throws AlipayApiException {

        log.info("支付宝异步通知到达：参数：{}", JSONs.obj2JsonStr(params));

        boolean signVerified = AlipaySignature.rsaCheckV1(params,
                alipayProperties.getAlipay_public_key(),
                alipayProperties.getCharset(), alipayProperties.getSign_type()); //调用SDK验证签名
        if(signVerified){
            log.info("验签通过.准备修改订单状态");
            //订单对外交易号
            String out_trade_no = params.get("out_trade_no");
            //状态
            String trade_status = params.get("trade_status");

            //修改订单的状态为已支付
            //1、发起远程调用
            //2、发送mq消息【我们用】
            mq.sendMsg(MqConst.EXCHANGE_ORDER,MqConst.RK_ORDER_PAYED,params);

            return "success";
        }else{
            return "你想干嘛！";
        }
    }
}
